/**
 * 原型模式
 * 用于创建重复的对象, 同时又能保证性能
 * 意图: 用原型实例指定创建对象的种类,  并且通过拷贝这些原型创建新的对象
 */

// 应用实例: 1 细胞分裂   2 Object.clone()方法
// 优点 : 性能高  2 逃避构造函数的约束
//缺点:  1、配备克隆方法需要对类的功能进行通盘考虑，这对于全新的类不是很难，但对于已有的类不一定很容易，特别当一个类引用不支持串行化的间接对象，或者引用含有循环结构的时候。 2、必须实现 Cloneable 接口。

// interface Prototype {
//     clone(): Prototype;
// }

// class Dog implements Prototype {
//     public name: string;
//     public birthYear: number;
//     public sex: string;
//     constructor() {
//         this.name = 'lili';
//         this.birthYear = 2021;
//         this.sex = '男';
//     }
//     public getDescription(): string {
//         return `狗狗的名字是${this.name} ,性别${this.sex}, 出生于${this.birthYear}`;
//     }
//     // 实现Clone方法
//     public clone(): Prototype {
//         return Object.create(this);
//     }
// }

// 使用 :
// const dog = new Dog();
// console.log(dog.getDescription());
// dog.birthYear = 2022;
// const dog1 = Object.create(dog);
// console.log("dog1--", dog1.getDescription());


// 上面使用Object.create()实现了clone, 下面用原生代码实现clone()

interface IPrototype {
    clone(): this;
}

class MyClass implements IPrototype {
    field: number[];
    constructor(field: number[]) {
        this.field = field;
    }

    clone() {
        return Object.assign({}, this);
    }
}

const OBJECT1 = new MyClass([1, 2, 3, 4]);
console.log("OBJECT1 : ", JSON.stringify(OBJECT1));
const OBJECT2 = OBJECT1.clone();
console.log("OBJECT2 : ", JSON.stringify(OBJECT2));
OBJECT2.field[1] = 101;
console.log("OBJECT2 : ", JSON.stringify(OBJECT2));
console.log("OBJECT1 : ", JSON.stringify(OBJECT1));



